home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CICA Windows Explosion!
/
The CICA Windows Explosion! - Disc 2.iso
/
programr
/
wtj208.zip
/
ZEMPEL
/
SOURCE
/
THUNKVB
/
VBARRAY.TXT
< prev
Wrap
Text File
|
1993-05-08
|
4KB
|
125 lines
Option Base 1
Dim bigArray&()
Dim NumElements&, ValElement&, ArrSize&
Dim hVBArray%, arraycreated%
Sub cmdMakeArray_Click ()
'this sub redimensions and fills a VB array
'then gets array linear addresses
On Error GoTo OutofMem
If (NumElements& * 4) > 15000000 Then
MsgBox "The array you requested is more than 15 MB, forget it", 16, "You must have a lot of memory!"
arraycreated% = 0
txAnswer = ""
Exit Sub
ElseIf (NumElements& * 4) > 999999 Then
user% = MsgBox("This array is between 1 and 15 MB", 65, "Make Big VB Array?")
If (user% = 2) Then Exit Sub
End If
If (NumElements& < 15999) Then
ArrSize& = NumElements& + 2
ArrColumns& = ArrSize&
ArrayRows& = 1&
ReDim bigArray&(1 To ArrColumns&, 1 To ArrayRows&)
Else
ArrayRows& = (NumElements& / 16000&) + 1
ArrSize& = NumElements& + 2&
ArrColumns& = 16000&
ReDim bigArray&(1 To ArrColumns&, 1 To ArrayRows&)
End If
On Error GoTo 0 'turns off error handling
For Y = 1 To ArrayRows& 'fills array with value
For X = 1 To (ArrColumns&) 'if overs 64000 bytes,
bigArray&(X, Y) = ValElement& 'fills memory in 16,000 byte blocks
Next X
Next Y
'This is the key code:fixing linear virtual address of VB array
lpVBArray& = VBPTRtoLong(bigArray&(1, 1)) 'must get pointer to first element
VBSel% = lpVBArray& \ &H10000 'get selector from pointer
lhvbarray& = GlobalHandle(VBSel%) 'get handle from selector
hVBArray% = VBLowWord(lhvbarray&) 'handle is in the low word
GlobalFix (hVBArray%) 'fix VB array in virtual space
Win31Linear& = GetSelectorBase(VBSel%) 'Win 3.1 function to get Windows3.1 linear address
UTAddress& = UTSelectorOffSetToLinear(lpVBArray&) 'UT function to get WIn32s linear address from pointer
GlobalUnFix (hVBArray%) 'must unfix VB Array
'must convert long to equivalent of dword (unsigned long int) and correct for offset of first element from selector start
VBLinearAddress# = CDbl(Win31Linear&)
If (VBLinearAddress# > 0) And ((ArrSize& * 4) > 65534) Then VBLinearAddress# = 9 + VBLinearAddress# 'VB arrays do not start at the selectors
If (VBLinearAddress# > 0) And ((ArrSize& * 4) < 65535) Then VBLinearAddress# = 7 + VBLinearAddress# 'large (huge) arrays are offset an additional
'two bytes
If (VBLinearAddress# < 0) And ((ArrSize& * 4) > 65534) Then VBLinearAddress# = 4294967305# + VBLinearAddress# 'same conversion for >2GB virtual addresses
If (VBLinearAddress# < 0) And ((ArrSize& * 4) < 65535) Then VBLinearAddress# = 4294967303# + VBLinearAddress#
VBUTAddress# = CDbl(UTAddress&)
If (VBUTAddress# < 0) Then VBUTAddress# = 4294967296# + VBUTAddress# 'long to unsigned long int (equivalent) conversion for Win32s address
OffSet# = VBUTAddress# - VBLinearAddress# 'compare Win32s address with Win3.1
txVBHandle.Text = Format$(hVBArray%)
txVBLinear.Text = Format$(VBLinearAddress#)
txVBUT.Text = Format$(VBUTAddress#)
txOffset.Text = Format$(OffSet#)
arraycreated% = 1
txAnswer = ""
Leavesub:
Exit Sub
OutofMem:
If (Err = 7) Then
MsgBox "Out of memory, reduce size of array", 16, "Array too big"
arraycreated% = 0
Else MsgBox "undefined error"
End If
Unload frmVBArray
Resume Leavesub
End Sub
Sub cmdSumArray_Click ()
'summming the array in a win32 function from VB
If arraycreated% = 0 Then
MsgBox "Redim Array first", 48
Exit Sub
End If
lpVBArray& = VBPTRtoLong&(bigArray&(1, 1)) 'get pointer to first element
VBSel% = lpVBArray& \ &H10000 'get selector from pointer
lhvbarray& = GlobalHandle(VBSel%)
hVBArray% = VBLowWord(lhvbarray&)
bigArray&(1, 1) = NumElements&
GlobalFix (hVBArray%)
'calling 32 bit function through UT
temp& = SumArray32(bigArray&(1, 1))
GlobalUnFix (hVBArray%)
Sum2& = bigArray&(2, 1)
txAnswer.Text = Format$(Sum2&)
End Sub
Sub Form_Load ()
txNumElemts.Text = Format$(10000)
txValElemt.Text = Format$(100)
End Sub
Sub txNumElemts_Change ()
NumElements& = Val(txNumElemts.Text)
If NumElements& < 1 Then
MsgBox "enter a number >0", 0, "Array size"
NumElements& = 10000
End If
End Sub
Sub txValElemt_Change ()
ValElement& = Val(txValElemt.Text)
End Sub